package ch.prokopovi.auxiliary;


class Place {

	int id;
	Integer regionId;
	String name;
	Double x;
	Double y;
	String addr;
	String wh;
	String phone;
	
	public Place(int id, Integer regionId, String name, Double x,
			Double y, String addr, String wh, String phone) {
		super();
		
		this.id = id;
		this.regionId = regionId;
		this.name = shortenName(name);
		this.x = x;
		this.y = y;
		this.addr = shortenAddr(addr);
		this.wh = shortenWorkHours(wh);
		setPhone(phone);
	}

	public Place(int id, String name, 
			Double x, Double y, String addr, String wh) {
		
		this(id, -1, name, x, y, addr, wh, null);		
	}
	
	private static String shortenAddr(String addr){
		
		String res = addr.replace("г.", "").replace("Г.", "");
				
		res = commonCleanUp(res);
		
		return res;
	}
	
	private static String shortenName(String nm) {
		final String pov = "ПОВ";
		final String cbu = "ЦБУ";

		String res = commonCleanUp(nm);
		
		res = res
				.replace("Центр банковских услуг", cbu) //
				.replace("Центр Банковских услуг", cbu) //
				.replace("Центр Банковских Услуг", cbu) //
				.replace("Обменный пункт", pov) //
				.replace("Пункт обмена валют", pov) //
				.replace("Операционная касса", "ОК") //
				.replace("Расчетно-кассовый центр", "РКЦ")
				.replace("г. ", "").replace("г.", "");
				
		return res;
	}
	
	/**
	 * shorten some words (weekdays) in provided string
	 * 
	 * @param wh
	 * @return
	 */
	private static String shortenWorkHours(String wh) {

		String res = commonCleanUp(wh);
		
		res = res
				.replace("Время работы:", "")
				.trim()
				.replace("понедельник", "Пн.")
				.replace("Понедельник", "Пн.")
				//
				.replace("вторник", "Вт.")
				.replace("Вторник", "Вт.")
				//
				.replace("среда", "Ср.").replace("Среда", "Ср.")
				.replace("четверг", "Чт.").replace("Четверг", "Чт.")
				.replace("пятница", "Пт.").replace("Пятница", "Пт.")
				.replace("суббота", "Сб.").replace("Суббота", "Сб.")
				.replace("воскресенье", "Вс.").replace("Воскресенье", "Вс.");

		res = res
				.replace("выходной", "вых.") .replace("Выходной", "вых.") //
				.replace("ежедневно", "ежедн.").replace("Ежедневно", "ежедн.") //				
				.replace("технический перерыв", "тех. пер.") //
				.replace("Технический перерыв", "Тех. пер.") //
				.replace("технические перерывы", "тех. пер.") //				          
				.replace("Технические перерывы", "Тех. пер.") //
				.replace("технологические перерывы", "тех. пер.") //
				.replace("обеденный перерыв", "обед") //
				.replace("Обеденный перерыв", "Обед") //
				.replace("круглосуточно", "круглосут.") //
				.replace("Круглосуточно", "круглосут.");
		
		return res;
	}
	
	private static String cleanUpPhone(String phone) {
		String br = "<br>";
		String br2 = ";&lt;br /&gt; ";	
		String br3 = "&lt;br&gt; ";
		String br4 = "&lt;br&gt;";
				
		String[] prefixes = new String[] {												 
				"15", "152", "154", "1545",
				"16", "162", "163", "165", "1653",
				"17", "174", "176", "177", "1742", "1775", "1777", "1795", 				
				"21", "212", "214", "216",  
				"22", "222", "225",  
				"23", "232", "2334", "2339", "2340", "2342", "236", "2363",
				"29", "291",
				"33", 
				"44"};
				
		String comma = ", ";
		
		if (phone == null)
			return phone;
		
		String res = commonCleanUp(phone);
		
		res = res.replace(br, comma).replace(br2, comma).replace(br3, comma).replace(br4, comma);
		
		if (res.endsWith(comma)) {
			res = res.substring(0, res.length() - comma.length());
		} // remove trailing comma
		
		res = res //
				.replace(" (круглосуточно, звонок со стационарного телефона бесплатно)", "") //
				.replace(" (бесплатно со стационарного телефона)", ""); 
				
		for (String prefix : prefixes) {
			res = res
					.replace("(+375 "+prefix+")", "+375 " + prefix)
					.replace("+375 (0"+prefix+")", "+375 " + prefix)
					.replace("(8-0"+prefix+")", "+375 " + prefix)
					.replace("(8 0"+prefix+")", "+375 " + prefix)
					.replace("(80"+prefix+")", "+375 " + prefix)
					.replace("8 (0"+prefix+")", "+375 " + prefix)
					.replace("(0"+prefix+")", "+375 " + prefix)
					.replace("("+prefix+")", prefix);	
		}// un-brecket prefixes
				
		return res;
	}
	
	private static String commonCleanUp(String str) {
		if (str == null)
			return str;
		
		String comma = ", ";
		
		
		String res = str.trim()
				.replaceAll(" +", " ") //replace 2 or more spaces with single space
				.replace(" "+comma, comma); // replace comma leading spaces
		
	
		return res;
	}

	public int getId() {
		return id;
	}

	public Integer getRegionId() {
		return regionId;
	}

	public String getName() {
		return name;
	}

	public Double getX() {
		return x;
	}

	public Double getY() {
		return y;
	}

	public String getAddr() {
		return addr;
	}

	public String getWh() {
		return wh;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {		
		this.phone = cleanUpPhone(phone);
	}		

	public void setRegionId(Integer regionId) {
		this.regionId = regionId;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Place [id=");
		builder.append(id);
		builder.append(", regionId=");
		builder.append(regionId);
		builder.append(", name=");
		builder.append(name);
		builder.append(", x=");
		builder.append(x);
		builder.append(", y=");
		builder.append(y);
		builder.append(", addr=");
		builder.append(addr);
		builder.append(", wh=");
		builder.append(wh);
		builder.append(", phone=");
		builder.append(phone);
		builder.append("]");
		return builder.toString();
	}
}
